package com.brillilab.common.rocketmq;

import java.util.Properties;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import com.aliyun.openservices.ons.api.Consumer;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.aliyun.openservices.ons.api.PropertyValueConst;

import lombok.Data;

/**
 * ONS配置
 * @author lj
 *
 */
@Configuration
public class OnsConfig {
	
	@Value("${aliyun.ons.accessKey:}")
	public String accessKey;
	@Value("${aliyun.ons.secretKey:}")
	public String secretKey;
	@Value("${aliyun.ons.onsAddr:}")
	public String onsAddr;	
	/**
	 * 生产者GROUP_ID
	 */
	@Value("${aliyun.ons.producerGroupId:}")
	public String producerGroupId;
	
	/**
	 * 获取消息的 Producer
	 *
	 * @return 生产者
	 */
	public Producer getProducer() {
		Properties properties = new Properties();
		properties.put(PropertyKeyConst.GROUP_ID, producerGroupId);
		properties.put(PropertyKeyConst.AccessKey, accessKey);
		properties.put(PropertyKeyConst.SecretKey, secretKey);
		// 设置发送超时时间，单位毫秒
		properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
		properties.put(PropertyKeyConst.NAMESRV_ADDR, onsAddr);
		Producer producer = ONSFactory.createProducer(properties);
		// 在发送消息前，必须调用start方法来启动Producer，只需调用一次即可。
		producer.start();
		return producer;
	}
	
	
	/**
	 * 	获取集群消费者
	 *	当使用集群消费模式时，消息队列 RocketMQ 认为任意一条消息只需要被集群内的任意一个消费者处理即可。
	 * @return Consumer
	 */
	public  Consumer getClusteringConsumer(String groupId) {
		return startConsumer(groupId, PropertyValueConst.CLUSTERING);
	}
	
	/**
	 * 	获取广播消费者
	 *	当使用广播消费模式时，消息队列 RocketMQ 会将每条消息推送给集群内所有注册过的客户端，保证消息至少被每台机器消费一次。
	 * @return Consumer
	 */
	public Consumer getBroadcastConsumer(String groupId) {
		return startConsumer(groupId, PropertyValueConst.BROADCASTING);
	}
	
	public Consumer startConsumer(String groupId, String propertyValueConst) {
		Properties properties = new Properties();
		properties.put(PropertyKeyConst.GROUP_ID, groupId);
		properties.put(PropertyKeyConst.AccessKey, accessKey);
		properties.put(PropertyKeyConst.SecretKey, secretKey);
		// 设置发送超时时间，单位毫秒
		properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
		properties.put(PropertyKeyConst.NAMESRV_ADDR, onsAddr);
		properties.put(PropertyKeyConst.MessageModel, propertyValueConst);
		Consumer consumer = ONSFactory.createConsumer(properties);
		// 在发送消息前，必须调用start方法来启动Producer，只需调用一次即可。
		consumer.start();
		return consumer;
	}

}
